package DB;

import Util.LerXML;
import java.sql.*;
import java.util.*;

public class ConexaoDB {

    private String Driver, URL, Usuario, Senha;
    private Connection conexao;
    private PreparedStatement comando;
    private List<Parametro> parametros = new ArrayList<Parametro>();
    static final String Caminho = "/agendasaudeWeb/config/myconfig.xml";
    
    public static Connection getConexao() throws ClassNotFoundException, SQLException{
        Connection conexao;    
        String Driver  = LerXML.Ler(Caminho,"driver");
        String URL     = LerXML.Ler(Caminho,"url");
        String Usuario = LerXML.Ler(Caminho,"usuario");
        String Senha   = LerXML.Ler(Caminho,"senha");
        Class.forName(Driver);        
        conexao = DriverManager.getConnection(URL, Usuario, Senha);
        return conexao;
    }
   
    public ConexaoDB() {
        Driver  = LerXML.Ler(Caminho,"driver");
        URL     = LerXML.Ler(Caminho,"url");
        Usuario = LerXML.Ler(Caminho,"usuario");
        Senha   = LerXML.Ler(Caminho,"senha");
    }
    
    public void ConectarDB()  throws Exception {
        Class.forName(Driver);        
        conexao = DriverManager.getConnection(URL, Usuario, Senha);
    }
    
    public void FecharConexao() throws Exception {
        conexao.close();
    }
    
    public void AutoCommit(boolean pTrans) throws Exception {
        conexao.setAutoCommit(pTrans);
    }
    
    public void Commit() throws Exception {
        conexao.commit();        
    }
    
    public void Rollback() throws Exception {
        conexao.rollback();
    }
    
    public void addParametro(int Ordem, TipoCampo Tipo, String Valor) {
    	   parametros.add(new Parametro(Ordem, Tipo, Valor));
    }

    public void limparParemetros() {
    	parametros.clear();
    }

    private void RodarParametros()  throws Exception {
    	for (Parametro param : this.parametros){
    		switch (param.Tipo()) {
    			case 0: comando.setInt(param.Ordem(),Integer.parseInt(param.Valor()));
    				break;
    			case 1: comando.setString(param.Ordem(),param.Valor());
    				break;
    			case 2: comando.setFloat(param.Ordem(), Float.parseFloat(param.Valor()));
    				break;
    			default:
    				break;
    		}
    	}
    }
    
    public ResultSet RetornaDados(String pSQL) throws Exception {
    	comando = conexao.prepareStatement(pSQL);
    	RodarParametros();    	
    	return comando.executeQuery();
    }
  
    public void ExecutarSQL(String pSQL)  throws Exception {
        comando = conexao.prepareStatement(pSQL);        
    	RodarParametros();
        comando.executeUpdate();
        comando.close();                    
    }
}